#include <iostream>
#include "comm.hpp"

using namespace std;

int main()
{
    int key = GetKey();
    int msgid = msgget(key,IPC_CREAT | IPC_EXCL | 0666);


    char *s = (char *)msgsnd(msqid, nullptr, 0);
    cout << "开始将shm映射到进程地址空间中..." << endl;
    // sleep(3);

    struct shmid_ds ds;
    shmctl(shmid, IPC_STAT, &ds);
    
    cout << "key :" <<ToHex(ds.shm_perm.__key) << endl;
    cout << "nattch :" <<ds.shm_nattch << endl;
    cout << "atime :" <<ds.shm_atime << endl;
    cout << "dtime :" <<ds.shm_dtime << endl;
    cout << "ctime :" <<ds.shm_ctime << endl;
    

    shmdt(s);
    cout << "开始将shm从进程地址空间中移除..." << endl;
    sleep(3);

    shmctl(shmid, IPC_RMID, nullptr);
    cout << "开始将shm从操作系统中删除" << endl;
    sleep(3);

    return 0;
}

// #include <iostream>
// #include "comm.hpp"

// using namespace std;

// int main()
// {
//     // 创建管道失败则直接退出
//     if (!MakeFifo())
//         return 1;
//     int key = GetKey();
//     // cout << "key:" << ToHex(key) << endl;

//     int shmid = CreateShm(key);
//     // cout << "shmid:" << shmid << endl;
//     // sleep(3);

//     char *s = (char *)shmat(shmid, nullptr, 0);
//     cout << "开始将shm映射到进程地址空间中..." << endl;
//     // sleep(3);

//     int fd = open(filename, O_RDONLY);

//     while (true)
//     {
//         int code = 0;
//         // 如果client端没有写入，这里read就会一直等待
//         // 直到client端写入后，向管道中发送提示后再进行读取
//         ssize_t n = read(fd, &code, sizeof(code));
//         if (n == 4)
//         {
//             cout << "共享内存中的内容：";
//             cout << s << endl;
//         }
//         // 如果n == 0，代表client端已经关闭，这里也直接退出
//         else if (n == 0)
//         {
//             return 2;
//         }
//     }

//     shmdt(s);
//     cout << "开始将shm从进程地址空间中移除..." << endl;
//     // sleep(3);

//     shmctl(shmid, IPC_RMID, nullptr);
//     cout << "开始将shm从操作系统中删除" << endl;
//     // sleep(3);

//     close(fd);
//     // unlink可以删除指定路径下的文件，这里删除管道文件
//     unlink(filename);

//     return 0;
// }